home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xmbase-grok-1.2 / chart.c < prev    next >
C/C++ Source or Header  |  1995-06-25  |  2KB  |  100 lines

  1. /*
  2.  * functions relating to charts, except drawing functions which are in
  3.  * chartdraw.c.
  4.  *
  5.  * add_chart_component        implements ADD button in the form editor
  6.  * del_chart_component        implements DELETE button in the form editor
  7.  * clone_chart_component    copies a chart component and its contents
  8.  */
  9.  
  10. #include "config.h"
  11. #include <X11/Xos.h>
  12. #include <stdlib.h>
  13. #include <Xm/Xm.h>
  14. #include "grok.h"
  15. #include "form.h"
  16. #include "proto.h"
  17.  
  18.  
  19. /*
  20.  * add a chart component to an item
  21.  */
  22.  
  23. void add_chart_component(
  24.     ITEM        *item)
  25. {
  26.     CHART        *array;
  27.     CHART        *chart;
  28.     int        i;
  29.  
  30.     array = (CHART *)(item->ch_ncomp++
  31.         ? realloc(item->ch_comp, item->ch_ncomp * sizeof(CHART))
  32.         : calloc(item->ch_ncomp, sizeof(CHART)));
  33.     if (!array)
  34.         fatal("no memory");
  35.     for (i=item->ch_ncomp-1; i > item->ch_curr; i--)
  36.         array[i] = array[i-1];
  37.     if (item->ch_curr < item->ch_ncomp-1)
  38.         item->ch_curr++;
  39.     item->ch_comp = array;
  40.     chart = &array[item->ch_curr];
  41.     mybzero((void *)chart, sizeof(CHART));
  42.     chart->xfat =
  43.     chart->yfat = TRUE;
  44.     chart->value[0].mul = 1;
  45.     chart->value[1].mul = 1;
  46.     chart->value[2].mul = 1;
  47.     chart->value[3].mul = 1;
  48. }
  49.  
  50.  
  51. /*
  52.  * delete a chart component from an item
  53.  */
  54.  
  55. void del_chart_component(
  56.     ITEM        *item)
  57. {
  58.     CHART        *chart = &item->ch_comp[item->ch_curr];
  59.     int        i;
  60.  
  61.     if (--item->ch_ncomp < 1) {
  62.         if (item->ch_comp)
  63.             free((void *)item->ch_comp);
  64.         item->ch_comp  = 0;
  65.         item->ch_ncomp = 0;
  66.         return;
  67.     }
  68.     if (chart->excl_if)        free((void *)chart->excl_if);
  69.     if (chart->color)        free((void *)chart->color);
  70.     if (chart->label)        free((void *)chart->label);
  71.     if (chart->value[0].expr)    free((void *)chart->value[0].expr);
  72.     if (chart->value[1].expr)    free((void *)chart->value[1].expr);
  73.     if (chart->value[2].expr)    free((void *)chart->value[2].expr);
  74.     if (chart->value[3].expr)    free((void *)chart->value[3].expr);
  75.  
  76.     for (i=item->ch_curr; i < item->ch_ncomp; i++)
  77.         item->ch_comp[i] = item->ch_comp[i+1];
  78.     if (item->ch_curr == item->ch_ncomp)
  79.         item->ch_curr--;
  80. }
  81.  
  82.  
  83. /*
  84.  * copy a chart component to an empty component buffer
  85.  */
  86.  
  87. void clone_chart_component(
  88.     CHART        *to,
  89.     CHART        *from)
  90. {
  91.     *to = *from;
  92.     to->excl_if      = mystrdup(from->excl_if);
  93.     to->color      = mystrdup(from->color);
  94.     to->label      = mystrdup(from->label);
  95.     to->value[0].expr = mystrdup(from->value[0].expr);
  96.     to->value[1].expr = mystrdup(from->value[1].expr);
  97.     to->value[2].expr = mystrdup(from->value[2].expr);
  98.     to->value[3].expr = mystrdup(from->value[3].expr);
  99. }
  100.